AWS CLIで構築するCloudWatch Agent
こんにちは、坂巻です。
システムのパフォーマンスに関するデータ(メトリクス)やログを収集する際に、CloudWatch Agentは使用されていますか? CloudWatch Agentを使用すると、Amazon EC2から標準外のメトリクス(ディスク使用率やメモリ使用率等)とログの両方を収集することが可能です。
今回はそんなCloudWatch Agentを、AWS CLIから構築してみたいと思います。
なお、本エントリではCloudWatch Agentの設定ファイルを、AWS Systems Manager(以下、SSM)パラメータストアに格納しています。 こうすることで、取得対象のメトリクス、ログ変更を、OSへのログインなしで対応することが可能になります。
なお、CloudWatch Agentの構築は、ウィザード形式で行うことも可能です。 ウィザード形式で実施する場合は、以下のエントリを確認ください。
目次
- 前提
- CloudWatch Agentのインストール
- CloudWatch Agentの設定ファイルをパラメータストアにアップロード
- CloudWatch Agent設定
- CloudWatch Agent設定変更
前提
本エントリでは以下の環境で構築を実施しています。
- インターネット接続可能なEC2(Amazon Linux 2)が構築済みであること
- SSMエージェントのバージョンは2.2.93.0以上であること
- CloudWatch Agentの設定ファイルが作成済みであること
本エントリで使用していますCloudWatch Agentの設定ファイルには、こちらに格納しています。設定ファイルは作成、更新する際は、以下を参考にしてください。
また、構築対象のEC2には、ロールにてCloudWatchAgentAdminPolicy
ポリシーをアタッチしています。
CloudWatch Agentに関するポリシーの詳細については、以下をご確認ください。
CloudWatch Agentのインストール
変数設定
AWS CLIからSSM経由でコマンドを実行していきますが、システム固有の情報等は環境変数にいれて実行したいと思います。
INSTANCE_ID=i-04998c2c5740aae93 PARAMETER_NAME=AmazonCloudWatch-linux FILE_PATH="/tmp/" FILE_NAME=amazon-cloudwatch-agent.json
変数に設定する値は環境にあわせて設定してください。
- INSTANCE_ID…CloudWatch Agentをインストールする対象のインスタンスID
- PARAMETER_NAME…パラメータストアに作成するパラメータの名前
- FILE_PATH…パラメータストアに流し込む設定ファイルを格納しているディレクトリ
- FILE_NAME…設定ファイル名称
変数確認
設定された変数が意図した通りに設定されているか確認しましょう。
cat << ETX INSTANCE_ID: ${INSTANCE_ID} PARAMETER_NAME: ${PARAMETER_NAME} FILE_PATH: ${FILE_PATH} FILE_NAME: ${FILE_NAME} ETX
CloudWatch Agentインストール
SSM経由でCloudWatch Agentをインストールします。
Run CommandでコマンドのドキュメントではAWS-ConfigureAWSPackage
を指定します。
aws ssm send-command \ --document-name "AWS-ConfigureAWSPackage" \ --targets "Key=instanceids,Values=${INSTANCE_ID}" \ --parameters "action=Install, name=AmazonCloudWatchAgent, version=latest"
正常にコマンドが実行されると、以下のようなjsonが出力されます。
{ "Command": { "Comment": "", "Status": "Pending", (略) "CommandId": "354fa776-cf6f-4d34-89bc-d3e6df2003b4", "InstanceIds": [], "MaxConcurrency": "50" } }
マネジメントコンソールよりRun Commandの実行結果を確認すると、バージョン1.201929.0
がインストールされたことが分かります。
CloudWatch Agentの設定ファイルをパラメータストアにアップロード
Agentの設定変更を考慮して、CloudWatch Agentの設定ファイルはパラメータストアに保存しておきます。 以下のコマンドでパラメータを作成します。
aws ssm put-parameter --name "${PARAMETER_NAME}" \ --type "String" --value file://"${FILE_PATH}${FILE_NAME}"
パラメータストアより「AmazonCloudWatch-linux」パラメータが作成されたことが確認できました。
CloudWatch Agentをインストールしたサーバにログインし、Agentの状態を確認してみます。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status { "status": "stopped", "starttime": "", "version": "1.201929.0" }
statusがstopped
となっており、Agentが停止していることがわかります。
CloudWatch Agent設定
SSM経由でCloudWatch Agentを設定します。
Run CommandでコマンドのドキュメントではAmazonCloudWatch-ManageAgent
を指定します。
aws ssm send-command \ --document-name "AmazonCloudWatch-ManageAgent" \ --targets "Key=instanceids,Values=${INSTANCE_ID}" \ --parameters "action=configure, mode=ec2, optionalConfigurationSource=ssm, \ optionalConfigurationLocation=${PARAMETER_NAME}, optionalRestart=yes" \ --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-1
コマンドを実行すると、以下のようなjsonが出力されます。
{ "Command": { "Comment": "", "Status": "Pending", (略) "CommandId": "00c04294-99a5-4fbc-a6d8-a43007101f39", "InstanceIds": [], "MaxConcurrency": "50" } }
マネジメントコンソールよりRun Commandの実行結果を確認してみます。
CloudWatch Agentをインストールしたサーバにログインし、Agentの状態を確認してみます。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status { "status": "running", "starttime": "2018-09-23T09:34:42+0000", "version": "1.201929.0" }
statusがrunning
となっており、Agentが起動していることがわかります。
CloudWatch Logsを確認すると、指定したログが取得されています。
また、カスタムメトリクスも取得されていました。
正しく動作しない場合はログ/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
や、マニュアルを確認しましょう。
CloudWatch Agent設定変更
CloudWatch Agentの設定を変更してみたいと思います。
ログ収集の対象に/var/log/yum.log
の設定を追加しました。
先程同様の、CloudWatch Agent設定コマンドを実行します。
aws ssm send-command \ --document-name "AmazonCloudWatch-ManageAgent" \ --targets "Key=instanceids,Values=${INSTANCE_ID}" \ --parameters "action=configure, mode=ec2, optionalConfigurationSource=ssm, \ optionalConfigurationLocation=${PARAMETER_NAME}, optionalRestart=yes" \ --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-1
jsonが出力されます。
{ "Command": { "Comment": "", "Status": "Pending", (略) "CommandId": "0e09c5f4-9cde-457c-a055-e5ddde3d4fc4", "InstanceIds": [], "MaxConcurrency": "50" } }
マネジメントコンソールよりRun Commandの実行結果を確認してみます。
CloudWatch Logsに追加した/var/log/yum.log
が出力されました。
さいごに
SSMパラメータストアに格納することで、取得対象変更が、OSへのログインなしで行うことができました。一度設定しておくと運用が楽になると思うので試してみてはいかがでしょうか。